import axios from 'axios'
import router from "@/router";
import store from '@/store'
import {Message} from 'element-ui'

const request = axios.create({
    baseURL: '/api',
    timeout: 5000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    // 如果是登录请求，不需要验证token
    if (config.url === '/user/login') {
        return config
    }

    // 从 store 或 localStorage 获取 token
    let token = store.state.auth.token
    if (!token && localStorage.getItem('token')) {
        try {
            token = JSON.parse(localStorage.getItem('token'))
        } catch (e) {
            token = localStorage.getItem('token')
        }
    }

    // 如果没有token，跳转到登录页
    if (!token) {
        store.dispatch('auth/logout')
        router.push("/index")
    } else {
        // 移除引号，如果token是字符串形式的话
        if (typeof token === 'string') {
            token = token.replace(/^["'](.+)["']$/, '$1')
        }
        // 设置 X-Token 请求头
        config.headers['X-Token'] = token

    }
    return config
}, error => {
    console.error('Request error:', error)
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        // 检查响应头中是否有新的token
        const new_token = response.headers['new_token']
        if (new_token) {
            // 更新 store 和 localStorage 中的 token
            store.commit('auth/SET_TOKEN', new_token)
        }
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }

        // 当权限验证不通过的时候给出提示
        if (res.code === '401' || res.code === 401) {
            Message.error('认证失败，请重新登录')
            // 清除用户信息
            store.dispatch('auth/logout')
            router.push("/login")
        }
        return res;
    },
    error => {
        console.error('Response error:', error)
        // 处理 401 错误
        if (error.response) {
            // 即使是错误响应，也要检查是否有新的token
            const new_token = error.response.headers['new_token']
            if (new_token) {
                store.commit('auth/SET_TOKEN', new_token)
            }

            if (error.response.status === 401) {
                Message.error('认证失败，请重新登录')
                store.dispatch('auth/logout')
                router.push("/login")
            } else if (error.response.data.message) {
                // 显示后端返回的错误信息
                Message.error(error.response.data.message)
            }
        }
        return Promise.reject(error)
    }
)
export default request

